#include <set>
#include <string>
#include <utility> // pair
#include <vector>
#include <fstream>
#include <iostream>

using namespace std;

bool isCow(int i, int j, const vector<vector<int>> &place) {
  // 1 - COW
  // 1. i,j 这个位置是否合法
  // 2. i,j 这个位置的值是否等于 1
  return i >= 0 && i < place.size() && 
    j >= 0 && j < place[0].size() && 
    place[i][j] == 1;
}

bool isGrass(int i, int j, const vector<vector<int>> &place) {
  return i >= 0 && i < place.size() && 
    j >= 0 && j < place[0].size() && 
    place[i][j] == 2;
}

int main(int argc, char const *argv[])
{
  /* code */
  ifstream ifs("ACowParty.in");

  int rows = 0, cols = 0;
  ifs >> rows >> cols;

  vector<int> v(cols, 0);
  vector<vector<int>> place(rows, v);

  for (int i = 0; i < rows; ++i) {
    string line;
    ifs >> line;

    for (int j = 0; j < cols; ++j) {
      if (line[j] == 'C') {
        place[i][j] = 1;
      }
      else if (line[j] == 'G') {
        place[i][j] = 2;
      }

      /*
      switch (line[j]) {
      case 'C':
        place[i][j] = 1;
        break;
      case 'G':
        place[i][j] = 2;
        break;
      default:
        place[i][j] = 0;
        break;
      }
      */
    }
  }

  int friends = 0;
  set<vector<pair<int, int>>> pairs;

  for (int i = 0; i < rows; ++i) {
    for (int j = 0; j < cols; ++j) {
      if (isGrass(i, j, place)) {
        // 表示我们遇到了一个有草的格子
        // 草这个格子他的位置是 i,j
        // 如何去查 i,j 这个格子的上下左右呢？
        
        // 上：i - 1, j + 0
        // 右：i + 0, j + 1
        // 下：i + 1, j + 0
        // 左：i + 0, j - 1

        // dx - i 的移动数量
        vector<int> dx {-1, 0, 1, 0};
        // dy - j 的移动数量
        vector<int> dy {0, 1, 0, -1};
        
        vector<pair<int, int>> v;
        // 判断 i,j 四周有多少头牛
        for (int k = 0; k < 4; ++k) {
          int ti = i + dx[k];
          int tj = j + dy[k];

          // 只要遇到牛就记录下来
          if (isCow(ti, tj, place)) {
            // 怎么把牛的信息记录下来
            // 一头牛的位置有 2 个数字表达
            // 当我们想简单记录一对数字的时候，推荐使用 pair
            pair<int, int> pos {ti, tj};
            v.push_back(pos);
          }
        }
        
        //
        if (v.size() > 2) {
          ++friends;
          continue;
        }

        if (v.size() == 2) {
          sort(v.begin(), v.end());
          pairs.insert(v);
        }
      }
    }
  }

  ofstream ofs("ACowParty.out");
  ofs << friends + pairs.size();

  return 0;
}
